﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
	<title>创建性模式</title>
</head>
<body>
	<a href="#hh2"><div style="border: 1px solid; width: 40px;margin-left: 80%;margin-top:50%;position: fixed;">
		<b>返回顶部</b>
	</div></a>
    <h2 id="hh2"><a href="设计原则.html" style="font-size:10px">设计原则</a>&nbsp;&nbsp;创建型模式&nbsp;&nbsp;<a href="结构型模式.html" style="font-size:10px">下一个</a></h2>
<pre>
  创建型模式就是用来创建对象的模式，抽象了实例化的过程。所有的创建型模式都有两个共同点。
  第一，它们都将系统使用哪些具体类的信息封装起来；
  第二，它们隐藏了这些类的实例是如何被创建和组织的。
  创建型模式包括 <a href="#a">单例模式</a>、<a href="#f">简单工厂</a>、<a href="#b">工厂方法模式</a>、<a href="#c">抽象工厂模式</a>、<a href="#d">建造者模式</a>
  和<a href="#e">原型模式</a>
</pre>
<div>
  <ul>
    <li>单例模式：解决的是实例化对象的个数问题，比如抽象工厂中的工厂、对象池等，除了Singleton之外，其他创建型模式解决的都是new所带来的耦合关系</li>
    <li>抽象工厂：创建一系列相互依赖对象，并在运行时改变系列</li>
    <li>工厂方法：创建单个对象，并在运行时改变</li>
    <li>原型模式：通过拷贝原型来创建新的对象</li>
    <li>建造者：创建操作对象，并根据操作对象进行生成</li>
  </ul>
</div>
	<div>
		<h3 id="a">单例模式</h3>
<pre>
  介绍：
    确保一个类只有一个实例,并提供一个全局访问点。
  产生原因：
    操作系统中只能有一个任务管理器,操作文件时,同一时间内只允许一个实例对其操作等,既然现实生活中有这样的应用场景,
    自然在软件设计领域必须有这样的解决方案了(因为软件设计也是现实生活中的抽象)，所以也就有了单例模式了。
  常用场景：应用中有对象需要是全局的且唯一。
  选择关键点：一个对象在应用中出现多个实例是否会引起逻辑上或者是程序上的错误。
  逆鳞：在以为是单例的情况下，却产生了多个实例。
</pre>
	</div>
  <div>
    <h3 id="f">简单工厂</h3>
<pre>
  介绍：
    降低对象之间的耦合度。
  备注：
    继承抽象类，由工厂类判断传递参数，来决定实例化那些类。
  常用场景：需要在一堆产品中选择其中一个产品。
  选择关键点：一种产品是否可根据某个参数决定它的种类。
  逆鳞：工厂类不能正常工作。
</pre>
  </div>
	<div>
		<h3 id="b">工厂方法</h3>
<pre>
  介绍：
    工厂模式把实现具体产品创建推迟到子类中，此时工厂类不再负责所有产品的创建，而只是给出具体工厂必须实现的接口。
    这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品。
  备注：
    抽象工厂类，定义抽象方法。子类继承抽象工厂，实现该方法。调用的时候，使用抽象类实例继承的子类，再去调用子类的方法。
  常用场景：（1）希望工厂与产品的种类对客户端保持透明，给客户端提供一致的操作。（2）不同的工厂和产品可以提供客户端不同的服务或功能。
  选择关键点：工厂类和产品类是否是同生同灭的关系
  逆鳞：-
</pre>
	</div>
	<div>
		<h3 id="c">抽象工厂</h3>
<pre>
  介绍：
    提供一个创建产品的接口来负责创建相关或依赖的对象，而不具体明确指定具体类。
    抽象工厂允许客户使用抽象的接口来创建一组相关产品，而不需要知道或关心实际生产出的具体产品是什么。这样客户就可以从具体产品中被解耦。
  备注：
    与工厂方法类似，定义一组抽象方法
  常用场景：需要一个接口可以提供一个产品组，且不必知道产品的具体种类。
  选择关键点：产品组是否需要一起提供，且是否有一致的接口。
  逆鳞：-
</pre>
	</div>
	<div>
		<h3 id="d">建造者</h3>
<pre>
  介绍：
    在软件系统中，有时需要创建一个复杂对象，并且这个复杂对象由其各部分子对象通过一定的步骤组合而成
  备注：
    操作类写步骤，参数抽象，具体实现在参数抽象中
  常用场景：需要构建一批构建过程相同但表示不同的产品，而构建过程非常复杂。
  选择关键点：各个产品的构建过程是否相同
  逆鳞：指挥者不能正常工作
</pre>
	</div>
	<div>
		<h3 id="e">原型</h3>
<pre>
  介绍：
    只创建一个类实例对象，如果后面需要更多这样的实例，可以通过对原来对象拷贝一份来完成创建，这样在内存中不需要创建多个相同的类实例，从而减少内存的消耗和达到类实例的复用
  备注：
    只有一个实例，以后创建需要从这个实例进行拷贝。分为深拷贝和浅拷贝
  常用场景：需要在运行时动态的创建指定实例种类的对象，或是需要复用其状态
  选择关键点：创建出来的对象是否可以立即投入使用
  逆鳞：在以为是深度拷贝的情况下，却未实现深度拷贝
</pre>
	</div>
</body>
</html>